Skip to content

Refactor/component#203

Merged
manNomi merged 49 commits into
solid-connection:mainfrom
manNomi:refactor/component
Jul 31, 2025
Merged

Refactor/component#203
manNomi merged 49 commits into
solid-connection:mainfrom
manNomi:refactor/component

Conversation

@manNomi
Copy link
Copy Markdown
Contributor

@manNomi manNomi commented Jul 31, 2025

관련 이슈

•	resolves: #️⃣ 

작업 내용

•	멘토 도메인 전반 리팩터링
•	폴더 구조 mentor/… 정비 및 네이밍 통일
•	MyMentorSection / MentorFindSection 분리, 무한 스크롤 적용
•	MentorCard, ArticleCard, ArticlePanel 등 UI 컴포넌트 분리
•	API·훅 구현
•	serverFetch 전역 세마포어 방식 재구성
•	useGetMentorList, useGetMyMentorProfile, useGetArticle, useGetArticleList 구현
•	멘토 신청·수정 ·삭제 API 연동
•	모달·알림 개선
•	RootModal 클라이언트/서버 분리 + 신규 신청 알림
•	customConfirm(zustand) 및 IconConfirmModal 개선
•	디자인·정리
•	하드코딩된 값 Tailwind 변수화
•	TopLogoBar 리팩터링, 글로벌 레이아웃 적용
•	불필요 컴포넌트·숨겨진 input 제거
•	오류 수정
•	Buffer → atob 변환 오류
•	Tab 위치 버그 등 소소한 UI·타입 오류 수정
•	Sentry 설정 보완 (sentry.client 수정)

특이 사항

•	모달 구조가 변경되어 다른 페이지에서 모달 호출 시 import 경로 확인 필수
•	serverFetch 세마포어 키 변경 → 기존 호출부는 새 함수 시그니처로 업데이트 필요
•	Sentry ⬆ : 환경변수(ORG, PROJECT, AUTH_TOKEN)가 없는 로컬/CI는 빌드 실패할 수 있음

한만욱 added 30 commits July 24, 2025 18:54
@manNomi manNomi requested a review from wibaek as a code owner July 31, 2025 10:34
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jul 31, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

  1. Sentry 클라이언트 설정이 간소화되었습니다.
  2. 기사 리스트를 가져오는 새로운 커스텀 훅이 추가되었습니다.
  3. 멘토 프로필 관련 상태의 초기값이 빈 객체에서 null로 변경되었습니다.
  4. 멘토 카드 타입이 null을 허용하도록 수정되었습니다.
  5. 여러 페이지에서 CloudSpinnerPage, TopLogoBar 등 컴포넌트의 import 경로가 일관되게 정리되었습니다.
  6. 레이아웃 구조가 GlobalLayout 컴포넌트 중심으로 리팩토링되었고, LayoutProvider 및 Layout 컴포넌트가 제거되었습니다.
  7. 로그인 및 로그인 콜백 페이지에서 하단 네비게이션 숨김 로직이 삭제되었습니다.
  8. 멘토 관련 페이지에서 기사 리스트 훅 경로 오타가 수정되고, 멘토/멘티 페이지 분기 로직이 정리되었습니다.
  9. 멘토 찾기 섹션에서 지역 필터링 로직이 useMemo로 추가되었습니다.
  10. 멘토 프로필 섹션에서 mentorProfile이 null일 때의 예외 처리가 강화되었습니다.
  11. 멘토 수정 페이지에서 articleList, myMentorProfile 등의 null 체크가 추가되어 안정성이 향상되었습니다.
  12. NotFound 페이지가 더 명확한 스타일의 직접 구현으로 교체되었습니다.
  13. 하단 네비게이션과 탑 네비게이션(TopNavigation) 등 기존 레이아웃 컴포넌트가 삭제되고, 새로운 GlobalLayout 및 TopLogoBar 컴포넌트가 도입되었습니다.
  14. BottomNavigation, RootModal 등 GlobalLayout 하위의 새로운 UI 컴포넌트와 유틸 함수들이 추가되었습니다.
  15. 커뮤니티, 대학 관련 상수(enum)가 배열 기반으로 리팩토링되었습니다.
  16. 드롭다운, 탭 등 일부 UI 컴포넌트가 삭제되었습니다.
  17. 멘토 카드, 멘토 지원 모달 등 일부 컴포넌트의 props 타입이 명시적으로 개선되었습니다.
  18. 일부 merge conflict가 남아있는 파일이 발견되었습니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40분

  • 복잡도: 여러 파일에 걸쳐 구조적 리팩토링, 타입 변경, 신규 컴포넌트 추가, 기존 컴포넌트 삭제, import 경로 정리, null 안전성 강화, 상수 enum → 배열 전환, merge conflict 미해결 등 다양한 변화가 포함되어 있습니다.
  • 검토 포인트: 신규 GlobalLayout 구조, 하위 네비게이션 로직, 멘토/멘티 분기, 타입 변경에 따른 영향, 삭제된 컴포넌트의 대체 여부, 남은 merge conflict 해결 필요 등.

Suggested reviewers

  • wibaek

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2aa6ae7 and d84ed10.

📒 Files selected for processing (4)
  • src/api/mentor/type/response.ts (1 hunks)
  • src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx (1 hunks)
  • src/components/mentor/MentorCard.tsx (1 hunks)
  • src/constants/community.ts (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🔭 Outside diff range comments (3)
src/app/mentor/modify/_ui/ModifyContent/index.tsx (2)

13-41: 다수의 병합 충돌을 해결해주세요

파일 전체에 걸쳐 해결되지 않은 병합 충돌이 있습니다. 올바른 import와 구현을 선택해야 합니다.

다음 사항을 확인하여 충돌을 해결하세요:

  1. 올바른 import 경로 선택:

    • ModifyBtnPanel: ./_ui/ModifyBtnPanel vs ./_ui/ModalBtnPanel
    • useGetArticleList: 올바른 경로 확인 (오타 수정: useGetAriticleListuseGetArticleList)
  2. 중복 선언 제거:

    • import 문과 변수 선언이 중복되어 있습니다
  3. 일관된 구현 선택:

    • 병합 시 어떤 브랜치의 구현을 사용할지 결정

169-173: articleList null 체크 추가 필요

articleList가 null이거나 undefined일 수 있으므로 안전한 처리가 필요합니다.

-          {articleList.map((article) => (
+          {articleList?.map((article) => (
             <div key={article.title} className="mb-6">
               <MentoArticlePanel article={article} />
             </div>
           ))}
src/app/mentor/modify/_ui/ModifyContent/_ui/ArticlePanel/index.tsx (1)

6-114: 대규모 병합 충돌 해결이 필요합니다

파일 전체에 걸친 병합 충돌로 인해 코드가 작동하지 않습니다.

다음 단계로 해결하세요:

  1. 충돌 마커 제거: 모든 <<<<<<<, =======, >>>>>>> 제거
  2. 일관된 구현 선택:
    • article prop vs articleData prop
    • 적절한 import 문 선택
  3. 누락된 import 추가: IconPlus가 import되지 않음
♻️ Duplicate comments (1)
src/app/sign-up/email/EmailSignUpForm.tsx (1)

7-7: 동일한 임포트 경로 오타가 발견되었습니다.

이전 파일과 동일하게 Input 컴포넌트의 임포트 경로가 "@/components/ui/Inputa"로 변경되었습니다. 두 파일에서 동시에 발생한 변경이므로 의도적일 수도 있지만, "Inputa"라는 네이밍이 일반적이지 않아 오타일 가능성이 높습니다.

위의 검증 스크립트를 통해 다음 사항들을 확인해주세요:

  1. Inputa 컴포넌트가 실제로 존재하는지
  2. 기존 Input 컴포넌트와의 관계
  3. 다른 파일들에서도 동일한 변경이 필요한지
🧹 Nitpick comments (8)
sentry.client.config.ts (1)

9-11: Trace Propagation 대상 도메인 범위 재확인 필요

  1. 로컬(localhost)과 본 서버 도메인만 포함되어 있습니다.
    - 스테이징, 프리뷰 배포 URL이 있다면 누락됐을 수 있습니다.
  2. browserTracingIntegration 는 Sentry SDK 7.94 기준으로 권장되는 형태이지만, 버전별 네이밍 차이가 있으니 의존성 버전과 문서 확인 권장드립니다.
src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx (1)

33-33: 이미지 대체 텍스트 개선 제안

thumbnailUrl이 있을 때만 이미지를 렌더링하도록 조건부 처리를 추가하면 더 안전합니다.

-<Image src={article.thumbnailUrl} alt={article.title} fill className="object-cover" />
+{article.thumbnailUrl && (
+  <Image src={article.thumbnailUrl} alt={article.title} fill className="object-cover" />
+)}
src/components/layout/GlobalLayout/ui/RootModal/index.tsx (1)

1-14: 1. 모달 관리를 위한 컨테이너 컴포넌트가 깔끔하게 구현되었습니다

- ServerModal과 ClientModal을 분리하여 관심사를 명확히 구분함
- 단순하고 명확한 구조로 가독성이 좋음
- GlobalLayout 리팩토링의 일환으로 적절히 설계됨

더 나은 유지보수성을 위해 JSDoc 주석 추가를 고려해보세요:

+/**
+ * 전역 모달 컨테이너
+ * 서버 사이드와 클라이언트 사이드 모달을 통합 관리
+ */
 const RootModal = () => {
src/components/layout/GlobalLayout/ui/BottomNavigation/lib/isRouteActive.ts (1)

1-5: 라우트 매칭 유틸리티 추가 완료! 🎯

기능 검토:
1. 정확한 로직: 정확한 경로 매칭과 하위 경로 매칭을 모두 처리
2. null 안전성: optional chaining으로 pathname null 처리
3. 명확한 목적: BottomNavigation의 활성 상태 판별용

개선 제안:
3번째 줄의 삼항 연산자가 불필요합니다. isActive가 이미 boolean이므로 단순화 가능해요.

-  return isActive ? true : false;
+  return isActive;
src/app/mentor/modify/_ui/ModifyContent/_ui/ArticlePanel/index.tsx (1)

55-66: 리팩토링이 잘 되었습니다

다음 개선사항들이 좋습니다:

  1. 드롭다운 핸들러 단순화: 인라인 switch 문으로 로직이 명확해짐
  2. 새 아티클 추가 UI: 조건부 렌더링으로 깔끔한 구현

다만 다음 사항을 추가로 개선하면 좋겠습니다:

+import { IconPlus } from "@/public/svgs/mentor";

삭제 로직 구현도 필요합니다:

       case ArticleDropdownType.DELETE:
-        // 삭제 로직
+        // TODO: 삭제 API 호출 구현
+        console.log('아티클 삭제:', articleData.id);
         break;

Also applies to: 69-104

src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx (3)

14-20: 아이콘 매핑에서 일관성 있는 네이밍이 필요합니다

ICON_COMPONENTS 객체에서 mentor 키가 WhatsNew 컴포넌트와 매핑되어 있는데, 이는 의미상 연결이 명확하지 않습니다. 멘토 기능을 나타내는 더 적절한 아이콘 이름이나 컴포넌트명 사용을 고려해보세요.

const ICON_COMPONENTS = {
  university: DegreeHat,
  community: EditTwo,
  home: Home,
- mentor: WhatsNew,
+ mentor: Human, // 또는 더 적절한 멘토 관련 아이콘
  my: Human,
} as const;

39-42: IIFE 사용을 단순화할 수 있습니다

즉시 실행 함수 표현식(IIFE)을 사용하지 않고 더 간단하게 작성할 수 있습니다.

- {(() => {
-   const IconComp = ICON_COMPONENTS[iconType];
-   return <IconComp color={isActive ? "#5950F6" : "#707070"} />;
- })()}
+ {React.createElement(ICON_COMPONENTS[iconType], {
+   color: isActive ? "#5950F6" : "#707070"
+ })}

또는 더 간단하게:

- {(() => {
-   const IconComp = ICON_COMPONENTS[iconType];
-   return <IconComp color={isActive ? "#5950F6" : "#707070"} />;
- })()}
+ {((IconComp) => <IconComp color={isActive ? "#5950F6" : "#707070"} />)(ICON_COMPONENTS[iconType])}

44-48: 중복된 스타일링 클래스를 개선할 수 있습니다

동일한 기본 클래스가 반복되고 있어 코드 가독성과 유지보수성이 떨어집니다.

+ const baseTextClass = "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px]";
+ const activeTextClass = `${baseTextClass} text-primary`;
+ const inactiveTextClass = `${baseTextClass} text-[rgba(0,0,0,0.6)]`;

<span
- className={
-   isActive
-     ? "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-primary"
-     : "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-[rgba(0,0,0,0.6)]"
- }
+ className={isActive ? activeTextClass : inactiveTextClass}
>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4b6aff0 and 2aa6ae7.

📒 Files selected for processing (49)
  • sentry.client.config.ts (1 hunks)
  • src/api/article/client/useGetArticleList.ts (1 hunks)
  • src/api/mentor/client/useGetMyMentorProfile.ts (1 hunks)
  • src/api/mentor/type/response.ts (1 hunks)
  • src/app/application/ScorePageContent.tsx (1 hunks)
  • src/app/community/[boardCode]/CommunityPageContent.tsx (1 hunks)
  • src/app/community/[boardCode]/[postId]/PostPageContent.tsx (1 hunks)
  • src/app/community/[boardCode]/[postId]/modify/PostModifyContent.tsx (1 hunks)
  • src/app/layout.tsx (2 hunks)
  • src/app/login/LoginContent.tsx (0 hunks)
  • src/app/login/apple/callback/AppleLoginCallbackPage.tsx (1 hunks)
  • src/app/login/kakao/callback/KakaoLoginCallbackPage.tsx (1 hunks)
  • src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx (1 hunks)
  • src/app/mentor/[id]/_ui/MentorDetialContent/index.tsx (1 hunks)
  • src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx (1 hunks)
  • src/app/mentor/_ui/MentorClient/_ui/MyMentorSection/index.tsx (1 hunks)
  • src/app/mentor/_ui/MentorClient/index.tsx (1 hunks)
  • src/app/mentor/chat/[chatId]/_ui/ChatContent/index.tsx (2 hunks)
  • src/app/mentor/chat/[chatId]/page.tsx (1 hunks)
  • src/app/mentor/modify/_ui/ModifyContent/_ui/ArticlePanel/index.tsx (3 hunks)
  • src/app/mentor/modify/_ui/ModifyContent/index.tsx (3 hunks)
  • src/app/not-found.tsx (1 hunks)
  • src/app/page.tsx (2 hunks)
  • src/app/score/submit/gpa/page.tsx (1 hunks)
  • src/app/score/submit/language-test/page.tsx (1 hunks)
  • src/app/sign-up/email/EmailSignUpForm.tsx (1 hunks)
  • src/app/university/UniversityPage.tsx (2 hunks)
  • src/app/university/page.tsx (1 hunks)
  • src/components/layout/BottomNavigation.tsx (0 hunks)
  • src/components/layout/GlobalLayout/index.tsx (1 hunks)
  • src/components/layout/GlobalLayout/ui/BottomNavigation/constant/NAV_ITEMS.ts (1 hunks)
  • src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx (1 hunks)
  • src/components/layout/GlobalLayout/ui/BottomNavigation/lib/isRouteActive.ts (1 hunks)
  • src/components/layout/GlobalLayout/ui/RootModal/index.tsx (1 hunks)
  • src/components/layout/GlobalLayout/ui/RootModal/ui/ClientModal/index.tsx (1 hunks)
  • src/components/layout/GlobalLayout/ui/RootModal/ui/ServerModal/index.tsx (1 hunks)
  • src/components/layout/Layout.tsx (0 hunks)
  • src/components/layout/TopNavigation.tsx (0 hunks)
  • src/components/loading/NotFound.tsx (0 hunks)
  • src/components/login/signup/SignupProfileScreen.tsx (1 hunks)
  • src/components/mentor/MentorApplyCountModal/ui/MentorApplyCountContent/index.tsx (1 hunks)
  • src/components/mentor/MentorCard/index.tsx (2 hunks)
  • src/components/ui/CloudSpinnerPage/index.tsx (1 hunks)
  • src/components/ui/TopLogoBar/index.tsx (1 hunks)
  • src/components/ui/dropdown.tsx (0 hunks)
  • src/components/ui/tab.tsx (0 hunks)
  • src/constants/commnunity.ts (1 hunks)
  • src/constants/university.ts (1 hunks)
  • src/context/LayoutContext.tsx (0 hunks)
💤 Files with no reviewable changes (8)
  • src/app/login/LoginContent.tsx
  • src/context/LayoutContext.tsx
  • src/components/layout/TopNavigation.tsx
  • src/components/loading/NotFound.tsx
  • src/components/ui/dropdown.tsx
  • src/components/layout/Layout.tsx
  • src/components/layout/BottomNavigation.tsx
  • src/components/ui/tab.tsx
🧰 Additional context used
🧠 Learnings (11)
📓 Common learnings
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.
src/app/mentor/chat/[chatId]/page.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/app/mentor/[id]/_ui/MentorDetialContent/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/components/mentor/MentorCard/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/app/mentor/_ui/MentorClient/_ui/MyMentorSection/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/app/mentor/_ui/MentorClient/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/components/layout/GlobalLayout/ui/BottomNavigation/constant/NAV_ITEMS.ts (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.

src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/components/mentor/MentorApplyCountModal/ui/MentorApplyCountContent/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

src/app/mentor/modify/_ui/ModifyContent/index.tsx (1)

Learnt from: manNomi
PR: #195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

🧬 Code Graph Analysis (7)
src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx (1)
src/utils/mockingGetData.ts (1)
  • getMentorListData (25-72)
src/components/ui/TopLogoBar/index.tsx (1)
public/svgs/home/index.ts (1)
  • IconCloud (9-9)
src/api/article/client/useGetArticleList.ts (1)
src/api/article/type/response.ts (1)
  • ArticleResponse (1-8)
src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx (2)
src/api/article/type/response.ts (1)
  • ArticleResponse (1-8)
src/types/mentor.ts (1)
  • Article (38-44)
src/app/not-found.tsx (1)
public/svgs/loading/index.ts (1)
  • IconNotFound (18-18)
src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx (6)
src/components/layout/GlobalLayout/ui/BottomNavigation/ui/DegreeHat.tsx (1)
  • DegreeHat (2-23)
src/components/layout/GlobalLayout/ui/BottomNavigation/ui/EditTwo.tsx (1)
  • EditTwo (2-21)
src/components/layout/GlobalLayout/ui/BottomNavigation/ui/Home.tsx (1)
  • Home (2-11)
src/components/layout/GlobalLayout/ui/BottomNavigation/ui/WhatsNew.tsx (1)
  • WhatsNew (2-23)
src/components/layout/GlobalLayout/ui/BottomNavigation/ui/Human.tsx (1)
  • Human (2-11)
src/components/layout/GlobalLayout/ui/BottomNavigation/constant/NAV_ITEMS.ts (1)
  • NAV_ITEMS (8-14)
src/app/mentor/modify/_ui/ModifyContent/_ui/ArticlePanel/index.tsx (2)
src/api/article/type/response.ts (1)
  • ArticleResponse (1-8)
public/svgs/mentor/index.ts (1)
  • IconPlus (34-34)
🪛 Biome (2.1.2)
src/api/mentor/type/response.ts

[error] 34-34: Expected a statement but instead found '<<<<<<< HEAD'.

Expected a statement here.

(parse)


[error] 37-37: Expected a statement but instead found '======='.

Expected a statement here.

(parse)

src/api/mentor/client/useGetMyMentorProfile.ts

[error] 16-17: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 18-18: Shouldn't redeclare 'myMentorProfile'. Consider to delete it or rename it.

'myMentorProfile' is defined here:

(lint/suspicious/noRedeclare)


[error] 18-18: Shouldn't redeclare 'setMyMentorProfile'. Consider to delete it or rename it.

'setMyMentorProfile' is defined here:

(lint/suspicious/noRedeclare)

src/app/mentor/_ui/MentorClient/index.tsx

[error] 11-11: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 11-11: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 12-12: expected , but instead found {

Remove {

(parse)


[error] 12-13: Expected a parameter but instead found '==='.

Expected a parameter here.

(parse)


[error] 14-14: expected ... but instead found !

Remove !

(parse)


[error] 14-15: Expected an expression for the left hand side of the >>> operator.

This operator requires a left hand side value

(parse)


[error] 15-15: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 15-15: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '==='.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '='.

Expected an expression here.

(parse)


[error] 14-16: Invalid assignment to >>>>>>> upstream/main ======

This expression cannot be assigned to

(parse)


[error] 17-17: expected , but instead found ?

Remove ?

(parse)


[error] 17-18: expected , but instead found >

Remove >

(parse)


[error] 18-18: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 18-18: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 10-28: Expected corresponding JSX closing tag for 'HEAD'.

Opening tag

closing tag

(parse)

src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx

[error] 24-26: Expected a statement but instead found '<<<<<<< HEAD
======='.

Expected a statement here.

(parse)


[error] 37-40: Expected a statement but instead found '>>>>>>> upstream/main

main'.

Expected a statement here.

(parse)

src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx

[error] 12-13: Expected a property, or a signature but instead found '==='.

Expected a property, or a signature here.

(parse)


[error] 17-18: Expected a property, or a signature but instead found '>'.

Expected a property, or a signature here.

(parse)


[error] 22-23: Expected a property, or a signature but instead found '>'.

Expected a property, or a signature here.

(parse)


[error] 14-14: Shouldn't redeclare 'IconLikeFill'. Consider to delete it or rename it.

'IconLikeFill' is defined here:

(lint/suspicious/noRedeclare)

src/app/mentor/modify/_ui/ModifyContent/index.tsx

[error] 21-24: Expected a statement but instead found '=======

main'.

Expected a statement here.

(parse)


[error] 25-25: Shouldn't redeclare 'ModifyBtnPanel'. Consider to delete it or rename it.

'ModifyBtnPanel' is defined here:

(lint/suspicious/noRedeclare)


[error] 27-27: Shouldn't redeclare 'ChannelType'. Consider to delete it or rename it.

'ChannelType' is defined here:

(lint/suspicious/noRedeclare)


[error] 46-47: Expected a statement but instead found '<<<<<<< HEAD'.

Expected a statement here.

(parse)


[error] 49-50: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 53-54: Expected a statement but instead found '>>>>>>> main'.

Expected a statement here.

(parse)


[error] 51-51: Shouldn't redeclare 'articleList'. Consider to delete it or rename it.

'articleList' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'profileImageUrl'. Consider to delete it or rename it.

'profileImageUrl' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'hasBadge'. Consider to delete it or rename it.

'hasBadge' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'menteeCount'. Consider to delete it or rename it.

'menteeCount' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'nickname'. Consider to delete it or rename it.

'nickname' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'country'. Consider to delete it or rename it.

'country' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'universityName'. Consider to delete it or rename it.

'universityName' is defined here:

(lint/suspicious/noRedeclare)


[error] 83-83: Shouldn't redeclare 'studyStatus'. Consider to delete it or rename it.

'studyStatus' is defined here:

(lint/suspicious/noRedeclare)

src/app/mentor/modify/_ui/ModifyContent/_ui/ArticlePanel/index.tsx

[error] 5-7: Expected a statement but instead found '<<<<<<< HEAD
<<<<<<< HEAD'.

Expected a statement here.

(parse)


[error] 19-20: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 22-23: Expected a statement but instead found '>>>>>>> main'.

Expected a statement here.

(parse)


[error] 30-31: Expected a property, or a signature but instead found '<<'.

Expected a property, or a signature here.

(parse)


[error] 32-35: Expected a statement but instead found '>>>>>>> upstream/main

article: ArticleResponse'.

Expected a statement here.

(parse)


[error] 35-37: Expected a statement but instead found '>>>>>>> main
}'.

Expected a statement here.

(parse)


[error] 40-42: Expected a statement but instead found '<<<<<<< HEAD
<<<<<<< HEAD'.

Expected a statement here.

(parse)


[error] 49-50: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 109-109: Expected a statement but instead found '>>>>>>> upstream/main
======='.

Expected a statement here.

(parse)


[error] 121-121: Expected a statement but instead found '>>>>>>> main'.

Expected a statement here.

(parse)


[error] 123-123: Expected a JSX Expression, a Element, or a text but instead found '<<<<<<'.

Expected a JSX Expression, a Element, or a text here.

(parse)


[error] 123-123: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 123-123: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 123-123: expected , but instead found <

Remove <

(parse)


[error] 124-124: expected , but instead found src

Remove src

(parse)


[error] 124-124: ';' expected'

An explicit or implicit semicolon is expected here...

(parse)


[error] 124-124: expected , but instead found alt

Remove alt

(parse)


[error] 124-124: expected , but instead found fill

Remove fill

(parse)


[error] 124-124: expected , but instead found className

Remove className

(parse)


[error] 125-125: expected , but instead found /

Remove /

(parse)


[error] 126-126: Expected a parenthesis '(' but instead found '<'.

Expected a parenthesis '(' here.

(parse)


[error] 126-126: Expected a type parameter but instead found '/'.

Expected a type parameter here.

(parse)


[error] 126-126: expected , but instead found div

Remove div

(parse)


[error] 126-126: Expected a parenthesis '(' but instead found '<'.

Expected a parenthesis '(' here.

(parse)


[error] 126-126: expected , but instead found className

Remove className

(parse)


[error] 126-126: Expected a parenthesis '(' but instead found '<'.

Expected a parenthesis '(' here.

(parse)


[error] 126-126: expected , but instead found className

Remove className

(parse)


[error] 128-128: Expected a parenthesis '(' but instead found '{'.

Expected a parenthesis '(' here.

(parse)


[error] 128-128: ';' expected'

An explicit or implicit semicolon is expected here...

(parse)


[error] 128-128: expected , but instead found <

Remove <

(parse)


[error] 128-128: Expected a type parameter but instead found '/'.

Expected a type parameter here.

(parse)


[error] 128-128: expected , but instead found div

Remove div

(parse)


[error] 128-128: Expected a parenthesis '(' but instead found '==='.

Expected a parenthesis '(' here.

(parse)


[error] 129-129: expected > but instead found <

Remove <

(parse)


[error] 123-129: Expected corresponding JSX closing tag for 'HEAD'.

Opening tag

closing tag

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 134-134: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 29-30: An empty interface is equivalent to {}.

Safe fix: Use a type alias instead.

(lint/suspicious/noEmptyInterface)


[error] 22-22: Shouldn't redeclare 'useDeleteDropDownHandler'. Consider to delete it or rename it.

'useDeleteDropDownHandler' is defined here:

(lint/suspicious/noRedeclare)


[error] 25-25: Shouldn't redeclare 'ArticleDropdownType'. Consider to delete it or rename it.

'ArticleDropdownType' is defined here:

(lint/suspicious/noRedeclare)


[error] 27-27: Shouldn't redeclare 'ArticleResponse'. Consider to delete it or rename it.

'ArticleResponse' is defined here:

(lint/suspicious/noRedeclare)


[error] 28-28: Shouldn't redeclare 'IconPencil'. Consider to delete it or rename it.

'IconPencil' is defined here:

(lint/suspicious/noRedeclare)


[error] 152-152: Expected a JSX Expression, a Element, or a text but instead found '<<<<<<'.

Expected a JSX Expression, a Element, or a text here.

(parse)


[error] 152-153: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 153-154: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 154-154: expected , but instead found <

Remove <

(parse)


[error] 154-154: expected , but instead found className

Remove className

(parse)


[error] 154-154: Expected a parenthesis '(' but instead found '{'.

Expected a parenthesis '(' here.

(parse)


[error] 154-154: ';' expected'

An explicit or implicit semicolon is expected here...

(parse)


[error] 154-154: expected , but instead found <

Remove <

(parse)


[error] 154-154: Expected a type parameter but instead found '/'.

Expected a type parameter here.

(parse)


[error] 154-154: expected , but instead found h2

Remove h2

(parse)


[error] 155-155: Expected a parenthesis '(' but instead found '<'.

Expected a parenthesis '(' here.

(parse)


[error] 155-155: expected , but instead found className

Remove className

(parse)


[error] 155-155: Expected a parenthesis '(' but instead found '{'.

Expected a parenthesis '(' here.

(parse)


[error] 155-155: ';' expected'

An explicit or implicit semicolon is expected here...

(parse)


[error] 155-155: expected , but instead found <

Remove <

(parse)


[error] 155-155: Expected a type parameter but instead found '/'.

Expected a type parameter here.

(parse)


[error] 155-155: expected , but instead found p

Remove p

(parse)


[error] 155-155: Expected a parenthesis '(' but instead found '==='.

Expected a parenthesis '(' here.

(parse)


[error] 156-156: expected > but instead found <

Remove <

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 159-159: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 168-168: Unexpected token. Did you mean {'>'} or &gt;?

(parse)


[error] 173-173: Expected a property, a shorthand property, a getter, a setter, or a method but instead found '<<'.

Expected a property, a shorthand property, a getter, a setter, or a method here.

(parse)


[error] 173-173: Expected an expression but instead found '<<'.

Expected an expression here.

(parse)


[error] 173-173: Expected an expression but instead found '<<'.

Expected an expression here.

(parse)


[error] 173-174: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 174-175: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 175-175: expected , but instead found title

Remove title

(parse)


[error] 175-175: expected , but instead found :

Remove :

(parse)


[error] 175-175: expected , but instead found article

Remove article

(parse)


[error] 176-176: expected , but instead found :

Remove :

(parse)


[error] 176-176: expected , but instead found article

Remove article

(parse)


[error] 177-177: Expected a type parameter but instead found '==='.

Expected a type parameter here.

(parse)

🔇 Additional comments (37)
sentry.client.config.ts (1)

6-6: 100 % Trace 샘플링 설정, 과부하 위험!

  1. 프로덕션에서 tracesSampleRate: 1.0 은 모든 트랜잭션을 전송합니다.
    - 트래픽이 늘면 네트워크·비용 부담이 커집니다.
    - 단계별(development, staging, production)로 샘플링 값을 분기하거나 환경변수로 제어하도록 권장합니다.
src/app/not-found.tsx (2)

1-1: 직접 SVG 컴포넌트 사용으로 개선됨

삭제된 NotFound 컴포넌트 대신 IconNotFound SVG를 직접 임포트하여 의존성을 줄이고 코드를 단순화했습니다.


5-9: 중앙 정렬과 직접 구현으로 깔끔하게 리팩토링됨

  1. 레이아웃 개선: flex flex-col items-center justify-center로 수직/수평 중앙 정렬이 명확하게 구현되었습니다
  2. 직접 렌더링: 외부 컴포넌트 의존성을 제거하고 아이콘과 텍스트를 직접 렌더링하여 코드가 더 명확해졌습니다
  3. 일관된 스타일링: font-serif text-base font-semibold 클래스로 텍스트 스타일이 명시적으로 정의되었습니다

전체적으로 불필요한 중간 컴포넌트를 제거하고 단순화한 좋은 리팩토링입니다.

src/app/mentor/chat/[chatId]/page.tsx (1)

3-4: 🟢 import 경로 _components_ui 변경 확인 완료

  1. 폴더 구조 리팩터링 방향에 맞춰 경로가 일관되게 수정되었습니다.
  2. 컴파일 타임에만 영향이 있으며 런타임 로직 변화는 없습니다.
src/app/mentor/chat/[chatId]/_ui/ChatContent/index.tsx (2)

8-8: 🟢 ChatMessageBox 경로 리팩터링 정상 반영

  1. 컴포넌트 위치가 _components_ui 로 이동한 변경 사항을 정확히 따라갔습니다.
  2. 의존성 불일치로 인한 빌드 오류 우려가 사라졌습니다.

134-134:

src/components/login/signup/SignupProfileScreen.tsx (1)

6-6: 임포트 경로 정상 확인
스크립트 실행 결과, src/components/ui/Inputa.tsx 파일이 존재합니다.
해당 파일은 Input 컴포넌트를 정상적으로 export하고 있습니다.
따라서 import { Input } from "@/components/ui/Inputa"; 구문은 의도된 네이밍이며 오류가 없습니다.
검증 요약:

  1. 파일 존재 여부
    • src/components/ui/Inputa.tsx
  2. 컴포넌트 export 확인
    • export { Input }
  3. import 사용 위치
    • SignupProfileScreen.tsx, EmailSignUpForm.tsx에서 정상 사용
      리뷰 코멘트를 무시해 주시면 됩니다.
src/constants/university.ts (1)

1-1: 지역 분류 구조가 깔끔하게 개선되었습니다.

enum에서 배열로 변경한 리팩토링이 매우 적절합니다. 지역 구분이 명확하고 사용하기 편리한 구조입니다.

src/app/score/submit/gpa/page.tsx (1)

5-5: 경로 일관성 확인 완료

  1. 반영 파일
    src/app/score/submit/gpa/page.tsx와 src/app/score/submit/language-test/page.tsx
  2. 상태
    /components/ui/Tab/tab.module.css가 대소문자까지 정확히 일치
  3. 결론
    다른 파일에서 해당 경로를 참조하지 않아 추가 수정이 필요 없습니다 🎉
src/app/score/submit/language-test/page.tsx (1)

5-5: 탭 스타일 모듈 경로 일관성 확인 완료

  1. 경로 존재 확인
     - src/components/ui/Tab/tab.module.css 파일이 대소문자까지 정확히 일치하며 존재합니다.
  2. 페이지 간 일관성
     - GPA 페이지와 언어 테스트 페이지 모두 동일한 경로를 사용하고 있어 일관성이 유지됩니다.
src/api/article/client/useGetArticleList.ts (2)

1-41: 훅 구현이 깔끔합니다!

기사 목록을 가져오는 커스텀 훅이 잘 구현되었습니다. null userId 처리와 타입 정의가 적절합니다.


28-28: fetchData 안정성 검증 완료

  1. 안정성 검증
    • useFetch 훅 내 fetchData가 useCallback([], …)으로 래핑되어 참조가 고정됩니다.
  2. 의존성 배열
    • }, [userId, fetchData]); 상태로 유지해도 불필요한 재실행이 없습니다.
  3. 결론
    • 별도 수정 없이 진행하셔도 됩니다.

수고 많으셨습니다!

src/app/mentor/[id]/_ui/MentorDetialContent/index.tsx (1)

10-10: 오타 수정 감사합니다!

useGetAriticleListuseGetArticleList 임포트 경로가 올바르게 수정되었습니다.

src/app/university/page.tsx (1)

4-4: 컴포넌트 경로 정리 확인

CloudSpinner 컴포넌트의 임포트 경로가 UI 컴포넌트 재구성에 맞춰 올바르게 업데이트되었습니다.

src/app/community/[boardCode]/[postId]/PostPageContent.tsx (1)

7-7: 1. CloudSpinnerPage 경로 변경 반영 완료
새로운 @/components/ui 위치에 맞춰 import 경로만 수정되었습니다. 다른 영향도 없으며 컴파일 에러 가능성도 낮아 보입니다.

src/app/community/[boardCode]/[postId]/modify/PostModifyContent.tsx (1)

6-6: 2. CloudSpinnerPage 경로 변경 반영 완료
loading 폴더에서 ui 폴더로 이동한 컴포넌트를 정상적으로 참조하고 있습니다.

src/app/community/[boardCode]/CommunityPageContent.tsx (1)

7-7: 3. CloudSpinnerPage 경로 변경 반영 완료
동일 패턴의 경로 수정이 일관되게 적용되었습니다.

src/app/application/ScorePageContent.tsx (1)

8-8: 4. CloudSpinnerPage 경로 변경 반영 완료
스코어 페이지도 동일하게 업데이트되어 모듈 해석 충돌 우려가 없습니다.

src/components/ui/CloudSpinnerPage/index.tsx (1)

1-1: CloudSpinner 컴포넌트 경로·export 재검증 요청
CloudSpinner 컴포넌트의 파일 위치와 export 형태를 다시 확인해 주세요.

  1. CloudSpinner 파일 위치 확인
    • src/components/ui/CloudSpinner/index.tsx의 존재 여부를 점검해 주세요.
  2. 기본(default) export 여부 확인
    • 해당 파일이 default export로 내보내지고 있는지 확인해 주세요.
src/app/university/UniversityPage.tsx (2)

8-8: 1. import 경로 변경이 일관되게 적용되었습니다

TopNavigation에서 TopLogoBar로의 전환이 올바르게 이루어졌습니다. 컴포넌트 구조 개선의 일환으로 layout에서 ui 디렉토리로 이동한 것이 적절합니다.


88-88: 2. JSX 컴포넌트 사용이 import와 일치합니다

TopLogoBar 컴포넌트로의 변경이 import와 일관되게 적용되어 있습니다.

src/app/page.tsx (1)

3-3: 1. 메인 페이지의 레이아웃 컴포넌트 전환이 완료되었습니다

- import 경로가 TopNavigation에서 TopLogoBar로 정확히 변경됨
- JSX 사용부도 일치하게 업데이트됨
- 전체 리팩토링 패턴과 일관성을 유지함

Also applies to: 23-23

src/app/login/kakao/callback/KakaoLoginCallbackPage.tsx (1)

11-11: 1. CloudSpinnerPage import 경로가 올바르게 업데이트되었습니다

컴포넌트 구조 개선에 따라 loading에서 ui 디렉토리로 이동한 경로 변경이 적절합니다. 새로운 GlobalLayout 시스템과 일관성을 유지합니다.

src/app/login/apple/callback/AppleLoginCallbackPage.tsx (1)

11-11: 컴포넌트 경로 통합 완료! 👍

CloudSpinnerPage의 import 경로가 @/components/ui/로 일관되게 정리되어 프로젝트의 컴포넌트 구조 개선에 잘 맞습니다.

src/components/mentor/MentorCard/index.tsx (2)

111-111: 1. 라우팅 경로 용어 통일 완료! ✨

/mento/modify에서 /mentor/modify로 수정되어 프로젝트 전반의 멘토 용어 통일 정책에 완벽하게 부합합니다.


124-124: 2. 버튼 높이 일관성 개선 👌

h-[41px]에서 h-10으로 변경하여 다른 버튼들과 동일한 높이(2.5rem)로 통일되었습니다. 시각적 일관성이 향상되었네요!

src/app/mentor/_ui/MentorClient/_ui/MyMentorSection/index.tsx (1)

14-14: null 안전성 개선 완료! 🛡️

myMentorProfile?.id로 옵셔널 체이닝을 추가하여 멘토 프로필이 null일 수 있는 새로운 타입 시스템에 안전하게 대응했습니다. 런타임 에러 방지에 효과적이네요!

src/components/layout/GlobalLayout/index.tsx (1)

1-21: 새로운 레이아웃 시스템 구축 완료! 🏗️

변경사항 정리:
1. 단순화된 구조: 기존 LayoutProvider 컨텍스트 시스템을 제거하고 직관적인 컴포넌트로 대체
2. 일관된 렌더링: BottomNavigation과 RootModal을 항상 렌더링하여 조건부 로직 복잡성 제거
3. 반응형 디자인: 360px-600px 너비 제약으로 모바일 우선 설계 적용
4. 명확한 인터페이스: children prop만 받는 깔끔한 구조

팀의 단순한 솔루션 선호도에 완벽하게 부합하는 아키텍처 개선입니다!

src/components/layout/GlobalLayout/ui/RootModal/ui/ServerModal/index.tsx (1)

7-13: 서버 사이드 인증 체크 로직이 깔끔합니다.

  1. 쿠키에서 refresh token을 안전하게 가져오기
  2. 토큰 만료 여부를 체크하기
  3. 로그인된 사용자에게만 모달 표시하기

서버 컴포넌트에서 인증 상태를 확인하는 적절한 구현입니다.

src/components/mentor/MentorApplyCountModal/ui/MentorApplyCountContent/index.tsx (1)

5-9: TypeScript 인터페이스 명시가 좋습니다.

  1. MentorApplyCountContentProps 인터페이스 추가로 타입 안전성 향상
  2. count 프로퍼티에 대한 명확한 타입 정의 및 주석
  3. 컴포넌트 시그니처가 더욱 명확해짐

코드 가독성과 유지보수성이 개선되었습니다.

src/app/layout.tsx (2)

5-5: GlobalLayout으로 레이아웃 통합이 잘되었습니다.

복잡한 중첩 구조에서 단일 GlobalLayout 컴포넌트로 깔끔하게 정리되었습니다.


10-11: ✅ 스크립트 로더 경로 정상 적용 확인
스크립트 로더가 모두 @/lib/ScriptLoader로 안전하게 이사했습니다! 🎉

  1. 경로 검사
    • rg 스크립트 결과, 이전 components/layout 경로 참조가 발견되지 않았습니다.
  2. 추가 조치 불필요
    • 모든 import가 새로운 경로(@/lib/ScriptLoader)로 업데이트되어 경로 이슈가 없습니다.
src/components/ui/TopLogoBar/index.tsx (1)

5-17: TopLogoBar 구현이 깔끔합니다.

  1. 고정 위치와 적절한 z-index 설정
  2. 브랜드 컬러를 활용한 그라디언트 배경
  3. IconCloud와 텍스트의 조화로운 배치
  4. clsx를 활용한 깔끔한 스타일 관리

삭제된 TopNavigation을 대체하는 적절한 구현입니다.

src/components/layout/GlobalLayout/ui/RootModal/ui/ClientModal/index.tsx (1)

1-26: 깔끔한 모달 구현입니다! 👍

Zustand를 활용한 클라이언트 모달 구현이 잘 되어 있습니다:

  • 적절한 기본값 설정
  • 명확한 prop 전달
  • 깨끗한 컴포넌트 구조
src/components/layout/GlobalLayout/ui/BottomNavigation/constant/NAV_ITEMS.ts (1)

1-15: 네비게이션 상수 정의가 잘 되어 있습니다

타입 안전성을 위한 as const 사용과 enum 정의가 적절합니다. 구조가 명확하고 유지보수하기 좋습니다.

src/app/mentor/modify/_ui/ModifyContent/index.tsx (1)

48-49: 멘토 프로필 null 처리가 잘 되어 있습니다

다음 개선사항들이 적절합니다:

  • userId에 대한 안전한 null 처리
  • 컴포넌트 early return으로 null 체크
  • null 체크 후 안전한 destructuring

Also applies to: 82-84

src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx (1)

25-27: 조건부 렌더링 로직이 잘 구현되었습니다

현재 경로가 네비게이션 아이템과 일치하지 않을 때 null을 반환하는 로직이 깔끔하게 처리되었습니다. 이는 불필요한 네비게이션 표시를 방지하는 좋은 접근입니다.

Comment on lines +15 to 20
<<<<<<< HEAD
const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);
=======
const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>({} as MentorCardPreview);
>>>>>>> main

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

1. 병합 충돌이 해결되지 않았습니다

- Git 병합 마커(<<<<<<< HEAD, =======, >>>>>>> main)가 남아있음
- 정적 분석 도구에서 파싱 에러 발생
- 타입 안전성을 위해 null 초기화(HEAD 브랜치)가 올바른 선택으로 보임

다음과 같이 병합 충돌을 해결해주세요:

-<<<<<<< HEAD
-  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);
-=======
-  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>({} as MentorCardPreview);
->>>>>>> main
+  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 16-17: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 18-18: Shouldn't redeclare 'myMentorProfile'. Consider to delete it or rename it.

'myMentorProfile' is defined here:

(lint/suspicious/noRedeclare)


[error] 18-18: Shouldn't redeclare 'setMyMentorProfile'. Consider to delete it or rename it.

'setMyMentorProfile' is defined here:

(lint/suspicious/noRedeclare)

🤖 Prompt for AI Agents
In src/api/mentor/client/useGetMyMentorProfile.ts around lines 15 to 20, there
are unresolved Git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> main)
present. Remove all these conflict markers and keep the initialization of
myMentorProfile state with null for type safety, as in the HEAD branch. Ensure
the code compiles without parsing errors by having a clean state initialization
without any conflict markers.

Comment thread src/api/mentor/type/response.ts Outdated
Comment on lines +33 to +37
<<<<<<< HEAD
export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")
=======
export type MentorCardPreview = MentorCardBase & { studyStatus: "24-1" | "24-2" }; // 학업 상태 (예: "24-1")
>>>>>>> main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

병합 충돌을 해결해주세요

코드에 해결되지 않은 병합 충돌이 남아있습니다. MentorCardPreview 타입을 nullable로 만들려는 의도로 보입니다.

다음과 같이 수정하세요:

-<<<<<<< HEAD
-export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")
-=======
-export type MentorCardPreview = MentorCardBase & { studyStatus: "24-1" | "24-2" }; // 학업 상태 (예: "24-1")
->>>>>>> main
+export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<<<<<<< HEAD
export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")
=======
export type MentorCardPreview = MentorCardBase & { studyStatus: "24-1" | "24-2" }; // 학업 상태 (예: "24-1")
>>>>>>> main
export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")
🧰 Tools
🪛 Biome (2.1.2)

[error] 34-34: Expected a statement but instead found '<<<<<<< HEAD'.

Expected a statement here.

(parse)


[error] 37-37: Expected a statement but instead found '======='.

Expected a statement here.

(parse)

🤖 Prompt for AI Agents
In src/api/mentor/type/response.ts around lines 33 to 37, there is an unresolved
merge conflict in the definition of MentorCardPreview. Remove the conflict
markers and define MentorCardPreview as a union type of MentorCardBase with
studyStatus and null, making it nullable as intended.

Comment on lines +16 to +40
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> main
const { page, lastElementRef } = useInfinityScroll();
const { mentorList } = useGetMentorList({
page,
region: selectedFilter !== FilterTab.ALL ? selectedFilter : undefined,
});
<<<<<<< HEAD
=======
const mentorListData = getMentorListData();

const filteredMentors = useMemo(() => {
return mentorListData.filter((mentor) => {
if (selectedFilter === FilterTab.ALL) return true;
if (selectedFilter === FilterTab.EUROPE) return mentor.country === FilterTab.EUROPE;
if (selectedFilter === FilterTab.AMERICAS) return mentor.country === FilterTab.AMERICAS;
if (selectedFilter === FilterTab.ASIA) return mentor.country === FilterTab.ASIA;
return false;
});
}, [mentorListData, selectedFilter]);
>>>>>>> upstream/main
=======
>>>>>>> main
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

병합 충돌을 해결해주세요

현재 코드에 해결되지 않은 병합 충돌 마커가 있습니다. 이로 인해 빌드가 실패합니다.

다음과 같이 수정하세요:

-<<<<<<< HEAD
-<<<<<<< HEAD
-=======
->>>>>>> main
   const { page, lastElementRef } = useInfinityScroll();
   const { mentorList } = useGetMentorList({
     page,
     region: selectedFilter !== FilterTab.ALL ? selectedFilter : undefined,
   });
-<<<<<<< HEAD
-=======
-  const mentorListData = getMentorListData();
-
-  const filteredMentors = useMemo(() => {
-    return mentorListData.filter((mentor) => {
-      if (selectedFilter === FilterTab.ALL) return true;
-      if (selectedFilter === FilterTab.EUROPE) return mentor.country === FilterTab.EUROPE;
-      if (selectedFilter === FilterTab.AMERICAS) return mentor.country === FilterTab.AMERICAS;
-      if (selectedFilter === FilterTab.ASIA) return mentor.country === FilterTab.ASIA;
-      return false;
-    });
-  }, [mentorListData, selectedFilter]);
->>>>>>> upstream/main
-=======
->>>>>>> main

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 24-26: Expected a statement but instead found '<<<<<<< HEAD
======='.

Expected a statement here.

(parse)


[error] 37-40: Expected a statement but instead found '>>>>>>> upstream/main

main'.

Expected a statement here.

(parse)

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx between lines
16 and 40, there are unresolved merge conflict markers (<<<<<<<, =======,
>>>>>>>) present in the code. Remove all these conflict markers and ensure the
code is properly merged by choosing the correct logic or combining both changes
as needed to maintain functionality and allow the project to build successfully.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 해결된 사항입니다

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

@manNomi 확인해보겠습니다.


🏁 Script executed:

#!/bin/bash
# Check the current state of the file to verify if merge conflicts are resolved
cat "src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx"

Length of output: 2525


@manNomi 확인해보니 현재 파일에는 여전히 병합 충돌 마커들이 남아있는 것으로 보입니다:

16-18번 라인:

<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> main

24-33번 라인:

<<<<<<< HEAD
=======
  const mentorListData = getMentorListData();
  // ... 필터링 로직
>>>>>>> upstream/main
=======
>>>>>>> main

로컬에서 해결하셨다면 변경사항을 푸시해주세요. 혹시 다른 파일을 말씀하신 건가요? 🤔

  (\   /)
 ( ._.)
o_(")(")

🧬 Code Graph Analysis Results

Possibly relevant snippets from src/utils/mockingGetData.ts (lines 25-72)

export const getMentorListData = () => {
  const mentors: Mentor[] = [
    {
      id: 1,
      profileImageUrl: undefined,
      nickname: "김솔거너",
      country: "미국",
      universityName: "노스캐롤라이나 웨일런대학교(A성)",
      studyStatus: MentorStudyStatus.STUDYING,
      menteeCount: 7,
      hasBadge: true,
      introduction: "안녕하세요! 저는 미국 노스캐롤라이나 웨일런대학교에서 교환학생을 3년간 재학중인 김솔거너입니다!",
      channels: [
        { type: ChannelType.BLOG, url: "https://blog.example.com" },
        { type: ChannelType.BRUNCH, url: "https://brunch.example.com" },
      ],
      isApplied: false,
    },
    {
      id: 2,
      profileImageUrl: undefined,
      nickname: "박솔거너",
      country: "스웨덴",
      universityName: "보라스대학",
      studyStatus: MentorStudyStatus.SCHEDULED,
      menteeCount: 0,
      hasBadge: false,
      introduction: "안녕하세요! 스웨덴 교환학생입니다.",
      channels: [],
      isApplied: false,
    },
    {
      id: 3,
      profileImageUrl: undefined,
      nickname: "정솔거너",
      country: "독일",
      universityName: "푸르트바겐스마르크 경영실무대학교",
      studyStatus: MentorStudyStatus.COMPLETED,
      menteeCount: 7,
      hasBadge: true,
      introduction: "독일 교환학생 경험을 나누고 싶습니다.",
      channels: [],
      isApplied: false,
    },
  ];

  return mentors;
};
  • This function returns a static list of mentor objects with detailed properties such as id, nickname, country, universityName, studyStatus, menteeCount, hasBadge, introduction, channels, and isApplied.
  • It is relevant because the main file references getMentorListData() in a commented-out or alternative code block for filtering mentors by region.
  • The mentor data structure and fields here provide context for how mentors are represented and filtered in the UI component.

🧠 Learnings used
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.

Comment on lines +27 to +37
const mentorListData = getMentorListData();

const filteredMentors = useMemo(() => {
return mentorListData.filter((mentor) => {
if (selectedFilter === FilterTab.ALL) return true;
if (selectedFilter === FilterTab.EUROPE) return mentor.country === FilterTab.EUROPE;
if (selectedFilter === FilterTab.AMERICAS) return mentor.country === FilterTab.AMERICAS;
if (selectedFilter === FilterTab.ASIA) return mentor.country === FilterTab.ASIA;
return false;
});
}, [mentorListData, selectedFilter]);
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

필터링 로직 개선이 필요합니다

병합 충돌 해결 시 필터링 로직을 포함하기로 결정하신다면, 다음 문제들을 해결해야 합니다:

  1. 누락된 import 추가:

    • useMemo를 React에서 import
    • getMentorListData 함수 import
  2. 잘못된 필터링 비교 로직:

    • mentor.country(문자열)를 FilterTab enum 값과 비교하고 있어 항상 false를 반환합니다
    • 국가별 필터링을 위한 적절한 매핑이 필요합니다
  3. 데이터 소스 충돌:

    • API 데이터(mentorList)와 목 데이터(mentorListData)를 동시에 사용하고 있습니다
    • 하나의 데이터 소스를 선택해야 합니다

API 데이터를 사용하는 현재 구현을 유지하는 것을 권장합니다. 필터링은 이미 useGetMentorList 훅에서 처리되고 있습니다.

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx lines 27 to
37, the filtering logic has multiple issues: useMemo and getMentorListData are
not imported, mentor.country is incorrectly compared to FilterTab enum values
causing always false results, and there is a conflict between using API data and
mock data simultaneously. To fix this, import useMemo and getMentorListData if
needed, but preferably remove the manual filtering here and rely on the
filtering already done by the useGetMentorList hook to maintain a single data
source and correct filtering logic.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분 기능구현시 추후 삭제 에정입니다

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@manNomi 알겠습니다! 기능 구현 시 해당 부분을 삭제할 예정이시라면 현재 상태로 두시는 것이 맞습니다.

임시 코드에 대한 명확한 설명 감사합니다. 추후 기능 완성 시 깔끔하게 정리되겠네요.


✏️ Learnings added
Learnt from: manNomi
PR: solid-connection/solid-connect-web#203
File: src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx:27-37
Timestamp: 2025-07-31T10:48:45.913Z
Learning: In the solid-connect-web project, manNomi handles merge conflicts and temporary code by leaving it in place during development with plans to remove it during proper feature implementation, rather than immediately fixing non-critical temporary code.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.

Comment on lines +10 to +18
<<<<<<< HEAD
<<<<<<< HEAD
{isMentor ? (
=======
{!isMentor ? (
>>>>>>> upstream/main
=======
{isMentor ? (
>>>>>>> main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Git 병합 충돌을 해결해야 합니다.

코드에 병합 충돌 마커(<<<<<<<, =======, >>>>>>>)가 남아있어서 파일이 파싱되지 않습니다.

로직을 보면 isMentortrue일 때 멘토 페이지를, false일 때 멘티 페이지를 보여주는 것이 맞습니다.

다음 diff를 적용하여 병합 충돌을 해결하세요:

-<<<<<<< HEAD
-<<<<<<< HEAD
-      {isMentor ? (
-=======
-      {!isMentor ? (
->>>>>>> upstream/main
-=======
       {isMentor ? (
->>>>>>> main

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 11-11: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 11-11: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 12-12: expected , but instead found {

Remove {

(parse)


[error] 12-13: Expected a parameter but instead found '==='.

Expected a parameter here.

(parse)


[error] 14-14: expected ... but instead found !

Remove !

(parse)


[error] 14-15: Expected an expression for the left hand side of the >>> operator.

This operator requires a left hand side value

(parse)


[error] 15-15: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 15-15: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '==='.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '='.

Expected an expression here.

(parse)


[error] 14-16: Invalid assignment to >>>>>>> upstream/main ======

This expression cannot be assigned to

(parse)


[error] 17-17: expected , but instead found ?

Remove ?

(parse)


[error] 17-18: expected , but instead found >

Remove >

(parse)


[error] 18-18: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 18-18: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 10-28: Expected corresponding JSX closing tag for 'HEAD'.

Opening tag

closing tag

(parse)

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/index.tsx around lines 10 to 18, there are
leftover Git merge conflict markers causing parsing errors. Remove all conflict
markers (<<<<<<<, =======, >>>>>>>) and ensure the conditional rendering uses
{isMentor ? ( ... ) : ( ... )} to show the mentor page when isMentor is true and
the mentee page when false, reflecting the intended logic.

Comment on lines +30 to +55
<nav className="fixed bottom-0 flex h-[56px] w-full max-w-[600px] bg-white [box-shadow:0px_-2px_6px_0px_var(--K50,#F5F5F5)]">
{NAV_ITEMS.map(({ route, text, iconType }) => {
const isActive = isRouteActive(pathname, route);
return (
<Link
key={text}
href={route}
className="flex flex-[1_0_0] flex-col items-center self-stretch px-3 pb-2 pt-1.5 no-underline"
>
{(() => {
const IconComp = ICON_COMPONENTS[iconType];
return <IconComp color={isActive ? "#5950F6" : "#707070"} />;
})()}
<span
className={
isActive
? "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-primary"
: "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-[rgba(0,0,0,0.6)]"
}
>
{text}
</span>
</Link>
);
})}
</nav>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

접근성 개선이 필요합니다

현재 네비게이션에 접근성을 위한 속성들이 누락되어 있습니다.

<nav 
+ role="navigation" 
+ aria-label="하단 메인 네비게이션"
  className="fixed bottom-0 flex h-[56px] w-full max-w-[600px] bg-white [box-shadow:0px_-2px_6px_0px_var(--K50,#F5F5F5)]"
>
  {NAV_ITEMS.map(({ route, text, iconType }) => {
    const isActive = isRouteActive(pathname, route);
    return (
      <Link
        key={text}
        href={route}
+       aria-current={isActive ? "page" : undefined}
+       aria-label={`${text} 페이지로 이동`}
        className="flex flex-[1_0_0] flex-col items-center self-stretch px-3 pb-2 pt-1.5 no-underline"
      >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<nav className="fixed bottom-0 flex h-[56px] w-full max-w-[600px] bg-white [box-shadow:0px_-2px_6px_0px_var(--K50,#F5F5F5)]">
{NAV_ITEMS.map(({ route, text, iconType }) => {
const isActive = isRouteActive(pathname, route);
return (
<Link
key={text}
href={route}
className="flex flex-[1_0_0] flex-col items-center self-stretch px-3 pb-2 pt-1.5 no-underline"
>
{(() => {
const IconComp = ICON_COMPONENTS[iconType];
return <IconComp color={isActive ? "#5950F6" : "#707070"} />;
})()}
<span
className={
isActive
? "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-primary"
: "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-[rgba(0,0,0,0.6)]"
}
>
{text}
</span>
</Link>
);
})}
</nav>
<nav
role="navigation"
aria-label="하단 메인 네비게이션"
className="fixed bottom-0 flex h-[56px] w-full max-w-[600px] bg-white [box-shadow:0px_-2px_6px_0px_var(--K50,#F5F5F5)]"
>
{NAV_ITEMS.map(({ route, text, iconType }) => {
const isActive = isRouteActive(pathname, route);
return (
<Link
key={text}
href={route}
aria-current={isActive ? "page" : undefined}
aria-label={`${text} 페이지로 이동`}
className="flex flex-[1_0_0] flex-col items-center self-stretch px-3 pb-2 pt-1.5 no-underline"
>
{(() => {
const IconComp = ICON_COMPONENTS[iconType];
return <IconComp color={isActive ? "#5950F6" : "#707070"} />;
})()}
<span
className={
isActive
? "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-primary"
: "text-center font-serif text-xs font-normal leading-[1.66] tracking-[0.4px] text-[rgba(0,0,0,0.6)]"
}
>
{text}
</span>
</Link>
);
})}
</nav>
🤖 Prompt for AI Agents
In src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx between
lines 30 and 55, the navigation links lack accessibility attributes. Add
appropriate ARIA roles and attributes such as role="navigation" on the <nav>
element and aria-current="page" on the active <Link> elements to improve screen
reader support. Also, ensure that link text is descriptive and icons have
accessible labels or aria-hidden attributes as needed.

}

return (
<nav className="fixed bottom-0 flex h-[56px] w-full max-w-[600px] bg-white [box-shadow:0px_-2px_6px_0px_var(--K50,#F5F5F5)]">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Tailwind CSS 변수 사용을 확인해주세요

box-shadow에서 var(--K50,#F5F5F5) 변수를 사용하고 있는데, 이 CSS 변수가 프로젝트 전역에서 정의되어 있는지 확인이 필요합니다.

프로젝트에서 --K50 CSS 변수가 정의되어 있는지 확인하기 위해 다음 스크립트를 실행해보세요:


🏁 Script executed:

#!/bin/bash
# CSS 변수 --K50이 정의되어 있는지 확인
rg --type css --type scss --type less "\-\-K50" .
rg "K50" . -A 2 -B 2 | grep -E "(var\(|--|K50)"

Length of output: 325


CSS 변수 --K50 전역 정의 확인 요청
box-shadow에서 사용된 CSS 변수 --K50가 프로젝트 어디에도 정의되어 있지 않습니다. 아래 변경사항을 확인해주세요:

  1. 확인 사항: CSS 변수 --K50 전역 정의
    • tailwind.config.js 또는 전역 CSS 파일에 --K50 변수를 추가해주세요.
  2. 검토 사항: Fallback 처리 강화
    • var(--K50, #F5F5F5) 대신 Tailwind 색상 클래스를 활용하거나 명확한 변수 정의를 검토해주세요.
🤖 Prompt for AI Agents
In src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx at line 30,
the CSS variable --K50 used in the box-shadow is not defined globally. To fix
this, first add a global definition for --K50 in your tailwind.config.js or a
global CSS file to ensure it is recognized project-wide. Alternatively, replace
the CSS variable with a Tailwind color class or a direct color value to avoid
relying on an undefined variable and improve fallback handling.

Comment on lines +1 to +8
export const COMMUNITY_BOARDS = [
{ code: "FREE", nameKo: "자유" },
{ code: "EUROPE", nameKo: "유럽권" },
{ code: "AMERICAS", nameKo: "미주권" },
{ code: "ASIA", nameKo: "아시아권" },
];

export const COMMUNITY_BOARD_NAMES = {
[CommunityBoard.FREE]: "자유",
[CommunityBoard.EUROPE]: "유럽권",
[CommunityBoard.AMERICAS]: "미주권",
[CommunityBoard.ASIA]: "아시아권",
};

export enum CommunityCategory {
ALL = "전체",
FREE = "자유",
QUESTION = "질문",
}
export const COMMUNITY_CATEGORIES = ["전체", "자유", "질문"];
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

파일명 오타 수정이 필요합니다.

파일명이 commnunity.ts로 되어 있는데 community.ts가 올바른 표기입니다.

  1. 데이터 구조 개선: enum에서 배열로 변경한 것은 좋은 선택입니다

    • 더 간단하고 직관적인 구조로 개선되었습니다
    • COMMUNITY_BOARDS 객체 배열 구조가 명확합니다
  2. 일관성 확인: 코드와 한국어 이름의 매핑이 적절합니다

    • 지역별 구분이 명확하게 되어 있습니다
    • 카테고리 구성도 합리적입니다

파일명을 다음과 같이 수정해주세요:

-src/constants/commnunity.ts
+src/constants/community.ts
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const COMMUNITY_BOARDS = [
{ code: "FREE", nameKo: "자유" },
{ code: "EUROPE", nameKo: "유럽권" },
{ code: "AMERICAS", nameKo: "미주권" },
{ code: "ASIA", nameKo: "아시아권" },
];
export const COMMUNITY_BOARD_NAMES = {
[CommunityBoard.FREE]: "자유",
[CommunityBoard.EUROPE]: "유럽권",
[CommunityBoard.AMERICAS]: "미주권",
[CommunityBoard.ASIA]: "아시아권",
};
export enum CommunityCategory {
ALL = "전체",
FREE = "자유",
QUESTION = "질문",
}
export const COMMUNITY_CATEGORIES = ["전체", "자유", "질문"];
- src/constants/commnunity.ts
+ src/constants/community.ts
🤖 Prompt for AI Agents
In src/constants/commnunity.ts lines 1 to 8, the filename contains a typo and
should be renamed from commnunity.ts to community.ts to correct the spelling.
This change does not affect the code inside but ensures proper naming
conventions and avoids confusion.

Comment on lines +3 to +43
export const COUNTRIES_KO = [
// 2024-2 기준
// 아시아권
MALAYSIA = "말레이시아",
BRUNEI = "브루나이",
SINGAPORE = "싱가포르",
AZERBAIJAN = "아제르바이잔",
INDONESIA = "인도네시아",
JAPAN = "일본",
KYRGYZSTAN = "키르기스스탄",
TURKEY = "튀르키예",
HONG_KONG = "홍콩",
KAZAKHSTAN = "카자흐스탄",
ISRAEL = "이스라엘",
"말레이시아",
"브루나이",
"싱가포르",
"아제르바이잔",
"인도네시아",
"일본",
"키르기스스탄",
"튀르키예",
"홍콩",
"카자흐스탄",
"이스라엘",
"말레이시아",
// 미주권
USA = "미국",
CANADA = "캐나다",
AUSTRALIA = "호주",
BRAZIL = "브라질",
"미국",
"캐나다",
"호주",
"브라질",
// 유럽권
NETHERLANDS = "네덜란드",
NORWAY = "노르웨이",
DENMARK = "덴마크",
GERMANY = "독일",
LITHUANIA = "리투아니아",
LIECHTENSTEIN = "리히텐슈타인",
SWEDEN = "스웨덴",
SWITZERLAND = "스위스",
SPAIN = "스페인",
AUSTRIA = "오스트리아",
CZECH = "체코",
PORTUGAL = "포르투갈",
POLAND = "폴란드",
FRANCE = "프랑스",
FINLAND = "핀란드",
RUSSIA = "러시아",
"네덜란드",
"노르웨이",
"덴마크",
"독일",
"리투아니아",
"리히텐슈타인",
"스웨덴",
"스위스",
"스페인",
"오스트리아",
"체코",
"포르투갈",
"폴란드",
"프랑스",
"핀란드",
"러시아",
// 중국권
CHINA = "중국",
TAIWAN = "대만",
}
"중국",
"대만",
];
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

상수 데이터 사용 검증이 필요합니다.

enum에서 배열로의 구조 변경으로 인해 이 상수들을 사용하는 다른 코드에서 호환성 문제가 발생할 수 있습니다.

다음 스크립트로 이 상수들의 사용처를 확인해보겠습니다:


🏁 Script executed:

#!/bin/bash
# 설명: REGIONS_KO와 COUNTRIES_KO 상수 사용처 확인

# RegionKo, CountryKo enum 사용처 검색
echo "=== 기존 enum 사용처 검색 ==="
rg -A 3 "RegionKo|CountryKo"

# 새로운 상수 사용처 검색  
echo "=== 새로운 상수 사용처 검색 ==="
rg -A 3 "REGIONS_KO|COUNTRIES_KO"

# university.ts import 검색
echo "=== university.ts import 확인 ==="
rg -A 2 "from.*university|import.*university"

Length of output: 13151


호환성 검토 및 타입 정의 업데이트 필요

  1. RegionKo 타입에 “중국권” 추가
    • src/types/university.ts의 RegionKo 타입이 ["유럽권", "미주권", "아시아권"]으로 정의되어 있어,
    constants/university.tsREGIONS_KO(["유럽권", "미주권", "아시아권", "중국권"])와 불일치합니다.
    RegionKo"중국권"을 추가하거나, REGIONS_KO에서 제거해 양쪽을 맞춰주세요.

  2. REGIONS_KO 사용처 점검
    src/app/university/UniversityPage.tsx, src/app/application/ScorePageContent.tsx 등에서 REGIONS_KO를 직접 사용 중입니다.
    • 타입 기반 필터 로직이 예상치 못한 값(중국권)을 처리할 수 있는지, 에러 없이 동작하는지 확인이 필요합니다.

  3. COUNTRIES_KO 배열 중복 및 사용처
    COUNTRIES_KO 배열에 "말레이시아"가 두 번 등록돼 있어 중복 제거를 권장합니다.
    • 현재 검색 입력 컴포넌트(search-input-interest.tsx)에서는 사용 코드가 주석 처리돼 있어,
    실제 사용하지 않는다면 콘스탄트나 주석을 정리해 주세요.

🤖 Prompt for AI Agents
In src/constants/university.ts lines 3 to 43, update the RegionKo type in
src/types/university.ts to include "중국권" to match the REGIONS_KO array or remove
"중국권" from REGIONS_KO to keep them consistent. Review all usages of REGIONS_KO
in src/app/university/UniversityPage.tsx and
src/app/application/ScorePageContent.tsx to ensure they handle the "중국권" region
without errors. Remove the duplicate "말레이시아" entry from the COUNTRIES_KO array
to avoid redundancy. Finally, check if COUNTRIES_KO is actively used in
search-input-interest.tsx; if not, clean up the unused constant or related
commented code.

Comment on lines +6 to +17
"말레이시아",
"브루나이",
"싱가포르",
"아제르바이잔",
"인도네시아",
"일본",
"키르기스스탄",
"튀르키예",
"홍콩",
"카자흐스탄",
"이스라엘",
"말레이시아",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

중복 데이터 제거가 필요합니다.

"말레이시아"가 6번째 줄과 17번째 줄에 중복으로 들어있습니다.

  1. 데이터 정확성: 중복 제거로 데이터 일관성을 확보해야 합니다

    • 아시아권 섹션에서 하나를 제거해주세요
  2. 전체 구조: 지역별 분류와 주석이 잘 되어 있습니다

    • 2024-2 기준 데이터 표기가 명확합니다
    • 지역별 그룹핑이 체계적입니다

중복된 "말레이시아" 항목을 제거해주세요:

  // 아시아권
  "말레이시아",
  "브루나이",
  "싱가포르",
  "아제르바이잔",
  "인도네시아",
  "일본",
  "키르기스스탄",
  "튀르키예",
  "홍콩",
  "카자흐스탄",
  "이스라엘",
- "말레이시아",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"말레이시아",
"브루나이",
"싱가포르",
"아제르바이잔",
"인도네시아",
"일본",
"키르기스스탄",
"튀르키예",
"홍콩",
"카자흐스탄",
"이스라엘",
"말레이시아",
// 아시아권
"말레이시아",
"브루나이",
"싱가포르",
"아제르바이잔",
"인도네시아",
"일본",
"키르기스스탄",
"튀르키예",
"홍콩",
"카자흐스탄",
"이스라엘",
🤖 Prompt for AI Agents
In src/constants/university.ts between lines 6 and 17, the country "말레이시아"
appears twice, causing duplicate data. Remove the second occurrence at line 17
to ensure data consistency and avoid redundancy within the Asia region list.

@manNomi manNomi merged commit d7e8271 into solid-connection:main Jul 31, 2025
1 check was pending
@manNomi manNomi deleted the refactor/component branch August 2, 2025 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant